package com.seeyon.apps.ssoAndDoc.utils;

import com.seeyon.ctp.common.SystemEnvironment;
import com.seeyon.ctp.common.log.CtpLogFactory;
import org.apache.commons.logging.Log;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtils {
	 private static final int  BUFFER_SIZE = 2 * 1024;
	 private static final Log LOG = CtpLogFactory.getLog(ZipUtils.class);

	    /**  
	     * 压缩成ZIP 方法1 
	     * @param srcDir 压缩文件夹路径
	     * @param out    压缩文件输出流
	     * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构;
	     * false:所有文件跑到压缩包根目录下(注意：不保留目录结构可能会出现同名文件,会压缩失败)
	     * @throws RuntimeException 压缩失败会抛出运行时异常
	     */
	    public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure){
	        ZipOutputStream zos = null ;
	        try {
	            zos = new ZipOutputStream(out);
	            File sourceFile = new File(srcDir);
	            String names = sourceFile.getName();
	            compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);
	            LOG.info("");
	        } catch (Exception e) {
	        	LOG.error("压缩文件失败", e);
	        }finally{
	            if(zos != null){
	                try {
	                    zos.close();
	                } catch (IOException e) {
	                	LOG.error("-----JK-----压缩文件失败", e);
	                }
	            }
	        }
	    }
	    /**
	     * 递归压缩方法
	     * @param sourceFile 源文件
	     * @param zos        zip输出流
	     * @param name       压缩后的名称
	     * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构;
	     *  false:所有文件跑到压缩包根目录下(注意：不保留目录结构可能会出现同名文件,会压缩失败)
	     * @throws Exception
	     */
	    private static void compress(File sourceFile, ZipOutputStream zos, String name,
	                                 boolean KeepDirStructure) throws Exception{
	    	
	    		
	    	
	    	LOG.info("--------jingkang ------递归压缩方法");
	    
	        byte[] buf = new byte[BUFFER_SIZE];
	        if(sourceFile.isFile()){
	            // 向zip输出流中添加一个zip实体，构造器中name为zip实体的文件的名字
	            zos.putNextEntry(new ZipEntry(name));
	            // copy文件到zip输出流中
	            int len;
	            FileInputStream in = new FileInputStream(sourceFile);
	            while ((len = in.read(buf)) != -1){
	                zos.write(buf, 0, len);
	            }
	            // Complete the entry
	            zos.closeEntry();
	            in.close();
	        } else {
	            File[] listFiles = sourceFile.listFiles();	            
	            if(listFiles == null || listFiles.length == 0){
	                // 需要保留原来的文件结构时,需要对空文件夹进行处理
	                if(KeepDirStructure){
	                    // 空文件夹的处理
	                    zos.putNextEntry(new ZipEntry(name + "/"));
	                    // 没有文件，不需要文件的copy
	                    zos.closeEntry();
	                }
	            }else {
	                for (File file : listFiles) {
	                    // 判断是否需要保留原来的文件结构
	                    if (KeepDirStructure) {
	                        // 注意：file.getName()前面需要带上父文件夹的名字加一斜杠,
	                        // 不然最后压缩包中就不能保留原来的文件结构,即：所有文件都跑到压缩包根目录下了
//	                        compress(file, zos, name + "/" + file.getName(),KeepDirStructure);
	                    	
	                    	   compress(file, zos, name+"/"+ file.getName(),KeepDirStructure);
	                    } else {
	                        compress(file, zos, file.getName(),KeepDirStructure);

	                    }
	                }
	            }
	        }
	    }
		/**
		 * zipUrl 目的文件
		 * 2020.10.22  start------------wxt.guyinchuan
		 * */
		public static String getEdocFromZipUrl(String summaryId) {
			String applicationFoler = SystemEnvironment.getApplicationFolder();
			String fromZipFileFoler = applicationFoler.split("ApacheJetspeed")[0].replaceAll("\\\\", java.util.regex.Matcher.quoteReplacement("\\"))
					+"base"+File.separator+"edocForm"+File.separator;
			return fromZipFileFoler;
		}
		/**
		 * targetfile 压缩源文件文件
		 * 2020.10.22  start------------wxt.guyinchuan
		 * */
		public static String EdocFromFileUrl(String summaryId) {
			String applicationFolerzip = SystemEnvironment.getApplicationFolder();
			String fromFileFolerzip = applicationFolerzip.split("ApacheJetspeed")[0].replaceAll("\\\\", java.util.regex.Matcher.quoteReplacement("\\"))
					+"base"+File.separator+"edocFormFile"+File.separator+summaryId;
			return fromFileFolerzip;
		}
	 	

}
